perm filename PATHS.RLS[225,JMC] blob
sn#005364 filedate 1971-01-14 generic text, type T, neo UTF8
00100 COMMENT A COLLECTION OF FUNCTIONS FOR COMPUTING PATHS;
00200
00300 OFF ECHO;
00400
00500 COMMENT IS THERE A PATH FROM X TO Y IN THE GRAPH G WHERE SEEN
00600 IS A LIST OF VERTICES ALREADY SEEN?;
00700 ISPATH(X,Y,SEEN,G) ← X EQ Y OR ORLIS(SUBT(CDR ASSOC(X,G),SEEN),
00800 FUNCTION(LAMBDA W; ISPATH(W,Y,X.SEEN,G)));
00900
01000 ORLIS(U,FN) ← NOT NULL U AND (FN CAR U OR ORLIS(CDR U,FN));
01100
01200 COMMENT THIS IS A NOT VERY INTERESTING GRAPH;
01300 GR ← '((A B D) (B A D E C) (C B F) (D A B E) (E D B F) (F C E));
01400
01500 SUBT(U,V) ← IF NULL U THEN NIL ELSE IF CAR U MEMBER V THEN SUBT(CDR U,V)
01600 ELSE CAR U . SUBT(CDR U,V);
01700
01800 COMMENT DISTANCE(X,Y,G) IS THE DISTANCE FROM VERTEX X TO VERTEX Y
01900 IN THE GRAPH G. ITS AUXILIARY FUNCTIONS ARE DISTA, FIXUP. IT IS
02000 ASSUMED THAT Y IS ACCESSIBLE FROM X IN G.;
02100
02200 DISTANCE(X,Y,G) ← DISTA(NIL,LIST X,NIL,Y,G);
02300
02400
02500 DISTA(DEAD,LIVE,NEWS,Y,G) ←
02600 IF NULL LIVE THEN
02700 (LAMBDA W; IF NULL W THEN NIL
02800 ELSE (LAMBDA Z; IF NULL Z THEN NIL
02900 ELSE 1+Z)
03000 DISTA(DEAD,W,NIL,Y,G))
03100 FIXUP(NEWS,DEAD)
03200 ELSE IF CAR LIVE EQ Y THEN 0
03300 ELSE DISTA(CAR LIVE.DEAD,CDR LIVE,CDR ASSOC(CAR LIVE,G).
03400 NEWS, Y,G);
03500
03600 FIXUP(NEWS,DEAD) ← IF NULL NEWS THEN NIL
03700 ELSE(LAMBDA W; APPEND(SUBT(SUBT(CAR NEWS,DEAD),W),W))
03800 FIXUP(CDR NEWS,DEAD);
03900
04000
04100 COMMENT ISACCESSIBLE(X,Y,G) TELLS IF THE VERTEX Y IS ACCESSIBLE
04200 FROM THE VERTEX X IN THE GRAPH G.;
04300
04400 ISACCESSIBLE(X,Y,G) ← ISACCESSA(NIL,NIL,LIST LIST X,Y,G);
04500
04600 ISACCESSA(DEAD,LIVE,NEWS,Y,G) ←
04700 IF NULL LIVE THEN
04800 (LAMBDA W; IF NULL W THEN NIL
04900 ELSE ISACCESSA(DEAD,W,NIL,Y,G))
05000 FIXUP(NEWS,DEAD)
05100 ELSE IF CAR LIVE EQ Y THEN T
05200 ELSE ISACCESSA(CAR LIVE.DEAD,CDR LIVE,CDR ASSOC(CAR LIVE,G).
05300 NEWS, Y,G);
05400
05500 PATH(X,Y,G) ← (LAMBDA W; IF CAR W EQ 'NO THEN 'NO ELSE CDR W)
05600 PATHA(LIST X,Y,NIL,G);
05700
05800 PATHA(U,Y,SEEN,G) ←
05900 IF NULL U THEN 'NO . SEEN
06000 ELSE IF CAR U EQ Y THEN 'YES . LIST Y
06100 ELSE (LAMBDA W; IF CAR W EQ 'NO THEN PATHA(CDR U,Y,CDR W,G)
06200 ELSE 'YES . (CAR U . CDR W))
06300 PATHA(SUBT(CDR ASSOC(CAR U,G),SEEN),Y,CAR U . SEEN,G);
06400
06500 COMMENT LPATH(X,Y,N,G) IS A PATH FROM X TO Y IN G
06600 OF LENGTH AT MOST N+1 PROVIDED SUCH A PATH EXISTS. OTHERWISE, THE
06700 VALUE IS NO.;
06800
06900 LPATH(X,Y,N,G) ← LPATHA(LIST X,Y,N,G);
07000
07100 LPATHA(U,Y,N,G) ←
07200 IF NULL U THEN 'NO
07300 ELSE IF N=-1 THEN 'NO
07400 ELSE IF CAR U EQ Y THEN LIST Y
07500 ELSE (LAMBDA W; IF W EQ 'NO THEN LPATHA(CDR U,Y,N,G)
07600 ELSE CAR U . W)
07700 LPATHA(CDR ASSOC(CAR U,G),Y,N-1,G);